package mat.simul;

import java.util.*;

public class SimPCF8574
{
  private int adresseThisPCF8574 = mat.Cablage.PCF8574_AUX;
  private byte registrePCF8574;
  private Vector listeners;

  public SimPCF8574()
  {
    listeners = new Vector();
    registrePCF8574 = (byte)0xff;
  }

  public int getAdresseI2c()
  {
     return adresseThisPCF8574;
  }

  public void setAdresseI2c(int adresse)
  {
     adresseThisPCF8574 = adresse;
  }
  public void addToScan(ProcessPCF8574Event e)
  {
     if (!listeners.contains(e))
     {
	listeners.addElement(e);
     }
  }

  public void removeToScan(ProcessPCF8574Event e)
  {
     if (listeners.contains(e))
     {
       listeners.removeElement(e);
     }
  }

  public void removeAll()
  {
    listeners.clear();
  }

  public void init()
  {
      processWrite();
  }

   private void processWrite()
   {
      int count = listeners.size();
      for (int i = 0; i < count; i++)
      {
	 registrePCF8574 = ((ProcessPCF8574Event) listeners.elementAt(i)).doProcess(0, registrePCF8574);
      }
   }

   private byte processRead()
   {
      byte result = registrePCF8574;
      int count = listeners.size();
      for (int i = 0; i < count; i++)
      {
	 result = ((ProcessPCF8574Event) listeners.elementAt(i)).doProcess(1, result);
      }
      return result;
   }

// xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

  public int write(int adresseI2c, byte[] barr, int off, int len)
  {
     int result = -1;

       if (adresseI2c == adresseThisPCF8574)
       {
	    for (int i = 0; i< len; i++)
	    {
	       registrePCF8574 = barr[i + off];
	       //System.out.println("simPCF8574: " + Integer.toBinaryString(registrePCF8574));
	       processWrite();
	    }
	    result = len;
       }
     return result;
  }


   public int read(int adresseI2c, byte[] barr, int off, int  len)
   {
       int result = -1;

	 if (adresseI2c == adresseThisPCF8574)
	 {
	    for (int i = 0; i< len; i++)
	    {
	       barr[i + off] = processRead();
	    }
	    result = len;
	  }
       return result;
     }
}